package com.wrt.wm.util;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;

import org.apache.commons.io.FilenameUtils;
import org.apache.tika.Tika;
import org.springframework.stereotype.Component;

import com.wrt.wm.entity.AjaxResult;

import lombok.extern.log4j.Log4j2;

/**
 * 图片判断工具
 * 
 * @author 文瑞涛
 */
@Component
@Log4j2
public class JudgeImageUtil {

	private static Map<String, String> mapMimeType = new HashMap<>();
	private static final String JPEG = "image/jpeg";

	static {
		mapMimeType.put("bmp", "image/bmp");
		mapMimeType.put("jpe", JPEG);
		mapMimeType.put("jpeg", JPEG);
		mapMimeType.put("jpg", JPEG);
		mapMimeType.put("png", "image/png");
		mapMimeType.put("jfif", JPEG);
		mapMimeType.put("tif", "image/tiff");
		mapMimeType.put("tiff", "image/tiff");
	}

	/**
	 * 
	 * 判断是否为图像
	 * @param imgFile 图片文件对象
	 * @return 封装后的判断结果
	 *
	 */
	public AjaxResult isImage(File imgFile) {
		if (!imgFile.exists()) {
			return AjaxResult.fail("文件不存在");
		}
		// 获取文件名(包含扩展名)
		String filename = imgFile.getName();
		// 截取文件后缀(不带点)
		String ext = FilenameUtils.getExtension(filename).toLowerCase();
		if (!judgeSuffixAndMimeType(ext, imgFile)) {
			return AjaxResult.fail("文件格式异常");
		}
		try {
			BufferedImage img = ImageIO.read(imgFile);
			if(null == img || img.getWidth(null) <= 0 || img.getHeight(null) <= 0) {
				return AjaxResult.fail("图片无法处理");
			} else {
				return AjaxResult.success(ext, img);
			}
		} catch (Exception e) {
			log.error(e.getMessage(), e);
			return AjaxResult.fail("图片读取异常");
		}
	}

	/**
	 * 
	 * 通过文件对象获取MIME类型，判断文件后缀名是否匹配MIME类型
	 *
	 * @param suffix  文件后缀名
	 * @param imgFile 图片文件对象
	 * @return 判断结果true：匹配，false：不匹配
	 *
	 */
	private boolean judgeSuffixAndMimeType(String suffix, File imgFile) {
		String tempMime = mapMimeType.get(suffix);
		if (null == tempMime) {
			return false;
		} else {
			Tika t = new Tika();
			try {
				String mime = t.detect(imgFile);
				return tempMime.equals(mime);
			} catch (IOException e) {
				log.error(e.getMessage(), e);
				return false;
			}
		}
	}
}
